package com.douma._2022_7_5;

import java.util.*;

/**
 * 抖码算法，让算法学习变的简单有趣
 *
 * @作者 : 老汤
 */
public class 字符统计及重排 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        String s = sc.nextLine();

        Map<Character, Integer> map = new HashMap<>();
        // 统计每个字符出现的次数
        for (int i = 0; i < s.length(); i++) {
            Character c = s.charAt(i);
            map.put(c, map.getOrDefault(c, 0) + 1);
        }

        // 将 Map 转成 List
        List<Map.Entry<Character, Integer>> entryList = new ArrayList<>(map.entrySet());

        entryList.sort((a, b) -> {
            Character aChar = a.getKey();
            int aCharCnt = a.getValue();
            Character bChar = b.getKey();
            int bCharCnt = b.getValue();

            // 按照字母出现次数降序排列
            if (aCharCnt != bCharCnt) {
                return bCharCnt - aCharCnt;
            }
            // 如果字母出现次数相等的话，则按照字母规则来排序
            // ① 保证小写字母在前面，大写字母在后面
            if (Character.isLowerCase(bChar)
                    && Character.isUpperCase(aChar)) {
                return 1;
            }
            if (Character.isLowerCase(aChar)
                    && Character.isUpperCase(bChar)) {
                return -1;
            }
            // ② 如果字母都是小写，还是大写，按照字母顺序排序
            return aChar - bChar;
        });

        // 打印结果
        String res = "";
        for (int i = 0; i < entryList.size(); i++) {
            res += entryList.get(i).getKey() + ":";
            res += entryList.get(i).getValue() + ";";
        }

        System.out.println(res);

    }
}
